package PruebasUnitarias;

import junit.framework.TestCase;
import Modelo.*;

public class TunelElectromagneticoTest extends TestCase {
	
	private Bloque[][] bloques;
	private Mapa mapa;	
	
	protected void setUp() throws Exception {
		super.setUp();
		mapa= new Mapa(); 
		bloques= new Bloque[4][7];
		
		for(int i=0;i<4;i++)
			for(int j=0;j<7;j++)
				if(j!=0&&j!=6&&i!=0&&i!=3&&i!=0)
					bloques[i][j]= new Vacio(mapa);
				else
					bloques[i][j]= new Tierra(mapa);
		mapa.inicializarMapa(bloques);
	}
	
	public void testEsEjecutableSobre(){
		PoseedorDeHabilidad pooglin= new Pooglin(mapa);
		Habilidad tunel= new TunelElectromagnetico();
		pooglin.asignarHabilidad(tunel);
		bloques[2][2].alojar(pooglin);
		
		// a vacio
		assertTrue(tunel.esEjecutableSobre(pooglin));
		bloques[2][2].desalojar(pooglin);
		
		// a tierra
		bloques[2][3].alojar(pooglin);
		assertTrue(tunel.esEjecutableSobre(pooglin));
		bloques[2][3].desalojar(pooglin);
		
		// hacia fuera del mapa
		bloques[2][5].alojar(pooglin);
		assertFalse(tunel.esEjecutableSobre(pooglin));
		bloques[2][5].desalojar(pooglin);
		
		// cayendo
		bloques[3][3]=new Vacio(mapa);
		bloques[2][3].alojar(pooglin);
		pooglin.caer();
		assertFalse(tunel.esEjecutableSobre(pooglin));
		pooglin.caminar();
		bloques[2][3].desalojar(pooglin);
	}
	
	public void testEjecutarSobre(){
		PoseedorDeHabilidad pooglin= new Pooglin(mapa);
		Habilidad tunel= new TunelElectromagnetico();
		pooglin.asignarHabilidad(tunel);
		bloques[2][3].alojar(pooglin);
		bloques[0][6]= new Vacio(mapa);
		Personaje pooglin2= new Pooglin(mapa);
		bloques[0][6].alojar(pooglin2);
		assertTrue(bloques[0][6].estaAlojado(pooglin2));
		assertTrue(pooglin2.estaVivo());
		tunel.ejecutarSobre(pooglin);
		assertFalse(bloques[2][4] instanceof Vacio);
		assertTrue(bloques[2][4] instanceof Portal);
		assertFalse(bloques[0][6] instanceof Vacio);
		assertTrue(bloques[0][6] instanceof Portal);
		// veo si mato al pooglin que estaba en donde se creo el portal
		assertFalse(pooglin2.estaVivo());
		
		// de paso pruebo el portal
		bloques[2][3].desalojar(pooglin);
		bloques[2][4].alojar(pooglin);
		assertFalse(bloques[2][4].estaAlojado(pooglin));
		assertTrue(bloques[0][6].estaAlojado(pooglin));
		bloques[0][6].desalojar(pooglin);
		bloques[0][6].alojar(pooglin);
		assertFalse(bloques[0][6].estaAlojado(pooglin));
		assertTrue(bloques[2][4].estaAlojado(pooglin));
	}
}
